#include "Int_mqtt.h"

uint8_t mac[6] = {0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}; /*定义Mac变量*/
uint8_t ip[4] = {192, 168, 42, 240};                   /*定义lP变量*/
uint8_t sub[4] = {255, 255, 255, 0};                   /*定义subnet变量*/
uint8_t gw[4] = {192, 168, 42, 1};

Network network = {0};
MQTTClient mqttClient = {0};
uint8_t server_ip[4] = {192, 168, 42, 28}; // 服务器的ip
uint16_t server_port = 1883;               // 服务器端口
uint8_t sendBuf[1024];
uint8_t readBuf[1024];


messageHandler msg_handle = NULL;
void mqtt_reg_callback(messageHandler callback)
{
    msg_handle = callback;
}

// void mqtt_callback(MessageData *msg_data)
// {
//     MQTTMessage *msg = msg_data->message; // 把msg_data中的消息（数据）赋值给msg
//     printf("shou  dao  shu  ju !!!\r\n");
//     // payloadlen表示长度 后者表示内容
//     printf("%d:%s", msg->payloadlen, (char *)msg->payload);
// }
void W5500_RST(void)
{
    // 根据手册W5500复位引脚拉低后需要延时500us以上，然后在进行拉高
    HAL_GPIO_WritePin(W5500_RST_GPIO_Port, W5500_RST_Pin, GPIO_PIN_RESET);
    HAL_Delay(10);

    HAL_GPIO_WritePin(W5500_RST_GPIO_Port, W5500_RST_Pin, GPIO_PIN_SET);
    HAL_Delay(10);
}
void Eth_init(void)
{
    // 1.先复位W5500芯片
    W5500_RST();

    // 2.注册回调函数
    my_reg_cb();

    // 3.设置网络
    // mac地址
    setSHAR(mac);
    // ip地址
    setSIPR(ip); // 是没有人使用的ip地址，并且可以ping通
    // 子网掩码
    setSUBR(sub);
    // 默认网关
    setGAR(gw);
    printf("ETH SUCCESS\r\n");
}

void W5500_init(void)
{
    int rc = 0xff;

    // 1.初始化ETH
    Eth_init();
    HAL_Delay(3000);
    // 2.W5500有8个socket套接字，
    // 选择一个套接字作为后续连接mqtt服务器的接口
    NewNetwork(&network, 0);
    // 3.使用套接字连接目标服务器（server_ip就是我们在mqtt服务器上配置的ip地址和端口号）
    rc = ConnectNetwork(&network, server_ip, server_port);
    if (rc != SOCK_OK)
    {
        printf("fail to connect network");
        return;
    }
    printf("connect network success\n");

    // 4.初始化MQTT——使用连接上的套接字构建mqtt客户端（创建的mqtt客户端就在mqttClient里）
    MQTTClientInit(&mqttClient, &network, 1000, sendBuf, 1000, readBuf, 1000);

    // 5.设置mqtt客户端连接服务器的参数
    MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
    // 6.修改连接参数的值
    data.willFlag = 0;                    // 遗嘱：表示断开连接时，是否需要发送消息0表示不发送，1表示发送
    data.MQTTVersion = 3;                 // mqtt协议版本,3：3.1.1，4：3.1.0
    data.cleansession = 1;                // 是否清除之前的会话，1：清除，0：不清除
    data.keepAliveInterval = 60;          // 保持连接的时间（多长时间不使用还保持连接，表示60秒内不使用保持连接）
    data.clientID.cstring = "W5500_MQTT"; // 给服务端起一个名字（mqtt服务端设置的client_ID）
    data.username.cstring = NULL;
    data.password.cstring = NULL;
    rc = MQTTConnect(&mqttClient, &data); //   2.连接参数
    if (rc != SUCCESSS)
    {
        printf("fail to connect mqtt\n");
        return;
    }
    printf("connect mqtt success\n");

    // 7.订阅主题 ——参数1 订阅的主题（在mqttx设置的主题名称），参数2 QOS等级，参数3 回调函数
    MQTTSubscribe(&mqttClient, "zxx", QOS0, msg_handle);
}
// 接收数据
void MQTT_Receive(void)
{
    MQTTYield(&mqttClient, 100); // 保持心跳接收服务器的数据
}
